package com.zerdoor.service.impl;

import com.zerdoor.dao.ItemStageDao;
import com.zerdoor.service.ICommonPayService;
import com.zerdoor.service.ItemStageService;
import com.zerdoor.util.exception.FreezeMoneyNotEnoughException;
import com.zerdoor.util.exception.InsufficientBalanceException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by zhongjieyu on 2015/1/6.
 */
@Service
public class ItemStageServiceImpl implements ItemStageService {

    @Autowired
    private ItemStageDao itemStageDao;

    @Autowired
    private ICommonPayService commonPayService;

    @Override
    public List<Map<String, String>> findStageByContractId(int contractId) throws Exception {


        return itemStageDao.findStageByContractId(contractId);
    }


    @Override
    public void updateStageDeliverableById(String deliverable,String stageId) throws Exception {

        Map<String, String> param = new HashMap<String, String>();

        param.put("deliverable",deliverable);
        param.put("stage_id",stageId);

        itemStageDao.updateStageDeliverableById(param);

        //查询是否是计件任务，如果不是，那么就改变当前任务进度
        String itemId = itemStageDao.findItemIdByStageId(stageId);

        if(itemId != null && "".equals(itemId)){
            itemStageDao.updateCurrentProgressByTaskId(itemId);
        }

    }


    @Override
    public Map findOrderInfoByStageId(int stageId, int userId) throws Exception {

        //查询阶段费用信息
        Map stageCost = itemStageDao.findStageCostByStageId(stageId);

        //查询用户账户可用余额
        float wallet = commonPayService.findUserWalletEnough(userId);

        stageCost.put("wallet",wallet);

        return stageCost;
    }

    @Override
    public boolean addvaluePayByAlipay(int stageId, int user_id) throws Exception {
        return false;
    }

    @Override
    public boolean addvaluePayByPaypay(int stageId, int user_id) throws Exception {
        return false;
    }

    @Override
    public Map<String, Object> addvaluePayByBalance(int stageId, int user_id) throws Exception {

        //返回数据Map
        Map<String,Object> dataMap = new HashMap<String, Object>();

        //查询阶段信息
        Map itemStage = itemStageDao.findItemStageByStageId(stageId);

        //阶段状态不为 预存资金134002
        if(Integer.parseInt(String.valueOf(itemStage.get("stage_status"))) != 134002){
            dataMap.put("static","4");
            dataMap.put("msg","该阶段状态不为预存资金");
            return dataMap;
        }

        //四舍五入
        DecimalFormat df = new DecimalFormat("#.00");

        //查询阶段费用信息
        Map stageCost = itemStageDao.findStageCostByStageId(stageId);

        float popur = Float.parseFloat(String.valueOf(stageCost.get("popur")));
        float fee = Float.parseFloat(String.valueOf(stageCost.get("fee")));
        float stage = Float.parseFloat(String.valueOf(stageCost.get("stage")));
        float prestoreSurplus = Float.parseFloat(String.valueOf(stageCost.get("prestoreSurplus")));

        //阶段所有费用
        float stageSumMoney = Float.parseFloat(df.format( popur + fee + stage));
        //判断预存资金是否够支付本次阶段费用，如果足够就不需要冻结金额，直接减去预存资金
        if(stageSumMoney > prestoreSurplus){

            //应付总金额 减去预存资金剩余后的
            float sumMoney = popur + fee + stage - prestoreSurplus;


            sumMoney = Float.parseFloat(df.format(sumMoney));

            int order_task_id = Integer.parseInt(String.valueOf(stageCost.get("order_task_id")));

            //冻结金额
            boolean blockedFlag = commonPayService.updateBlockedUserWalletByUserId(sumMoney,user_id,112110,order_task_id,true,false);

            if(!blockedFlag){

                throw new InsufficientBalanceException("支付失败，账户余额不足，抛出自定义异常!用户ID："+ user_id + "；支付金额：" + sumMoney +"；支付类型：" + 112110);
            }
        }else{

            //放入应该从预存资金总减去的费用
            stageCost.put("stageSumMoney",stageSumMoney);
            //修改任务剩余预存资金
            itemStageDao.updateOrderTaskPrestoreSurplus(stageCost);

        }
        //更新阶段状态为进行中
        itemStage.put("stage_status",134003);

        itemStageDao.updateItemStageByStageId(itemStage);

        dataMap.put("static","0");
        dataMap.put("msg","支付成功！");

        return dataMap;
    }

    @Override
    public boolean updateThroughThisStage(int stageId, int userID) throws Exception {


        //查询阶段信息
        Map itemStage = itemStageDao.findItemStageByStageId(stageId);
        //阶段状态不为 进行中134003
        if(Integer.parseInt(String.valueOf(itemStage.get("stage_status"))) != 134003){

            return false;
        }

        //四舍五入
        DecimalFormat df = new DecimalFormat("#.00");

        //查询阶段费用信息
        Map stageCost = itemStageDao.findStageCostByStageId(stageId);

        //判断阶段费用信息如果为空，为空表示没有需要支付的订单
        if(stageCost == null){

            return false;
        }

        float popur = Float.parseFloat(String.valueOf(stageCost.get("popur")));
        float fee = Float.parseFloat(String.valueOf(stageCost.get("fee")));
        float stage = Float.parseFloat(String.valueOf(stageCost.get("stage")));
        //float prestoreSurplus = Float.parseFloat(String.valueOf(stageCost.get("prestoreSurplus")));

        //阶段所有费用
        float stageSumMoney = Float.parseFloat(df.format( popur + fee + stage));

        int order_task_id = Integer.parseInt(String.valueOf(stageCost.get("order_task_id")));

        //扣除用户账户余额和冻结金额
        boolean isFreeFlag = commonPayService.updateFreezeMoneyByUserId(stageSumMoney,userID,112107,order_task_id,true);

        if(!isFreeFlag){
            throw new FreezeMoneyNotEnoughException("支付失败，账户余额不足，抛出自定义异常!用户ID："+ userID + "；支付金额：" + stageSumMoney +"；支付类型：" + 112107);
        }

        //打款给艺术家 打推广费给推荐者 艺术家和艺术家推荐者 一人一个手续费卡
        //打款给艺术家，112103表示任务收入
        commonPayService.updateChargeUserWalletByUserId(stage,Integer.parseInt(String.valueOf(stageCost.get("artistUserId"))),112103);

        //委托方推荐者用户ID
        int bailePresenter = Integer.parseInt(String.valueOf(stageCost.get("bailePresenter")));
        //如果满足条件就打款给推荐者，112102表示推广收入
        if(Integer.valueOf(String.valueOf(stageCost.get("ispo"))) == 101001 && popur > 0 && bailePresenter != -1){

            commonPayService.updateChargeUserWalletByUserId(popur,bailePresenter,112102);
        }

        // 改变阶段状态为已完成 判断是否还有下一个阶段，有就判断预存金额够不够开启，如果后面没有最后一个阶段了 就维护项目订单状态

        //更新订单状态
        itemStageDao.updateOrderPopurByStageId(stageId);
        itemStageDao.updateOrderFeeByStageId(stageId);
        itemStageDao.updateOrderStageByStageId(stageId);

        //查询下一个阶段
        Map nextStageMap = itemStageDao.findNextStageByContractId(itemStage);

        //如果为空就表示已经没有下一个阶段了
        if(nextStageMap == null){
            //维护项目订单为已完成
            itemStageDao.updateOrderItemById(Integer.parseInt(String.valueOf(stageCost.get("item_order_id"))));
            //艺术家推荐者
            int artistPresenter = Integer.parseInt(String.valueOf(stageCost.get("artistPresenter")));

            //如果不等于-1 那么就表示该艺术家有推荐者
            if(artistPresenter != -1){
                //查询艺术家是否首次接包推广
                int ispoReceiver = itemStageDao.findUserIspoReceiverByPresenter(String.valueOf(stageCost.get("artistUserId")));
                //如果是首次接包推广，那么就给当前艺术家和艺术家的推荐者一人一个手续费卡
                if(ispoReceiver == 101001){

                    //手续费卡日志记录
                    Map user_fee = new HashMap();
                    user_fee.put("type",132101);
                    user_fee.put("remark","收入零手续费卡，任务订单ID：" + order_task_id + "，项目订单ID：" + stageCost.get("item_order_id"));
                    user_fee.put("num",1);


                    //给当前艺术家一个手续费卡
                    itemStageDao.updateUserFeeNumByUserId(String.valueOf(stageCost.get("artistUserId")));
                    user_fee.put("user_id",stageCost.get("artistUserId"));
                    //插入收入手续费卡记录
                    itemStageDao.insertUserFee(user_fee);

                    //给当前艺术家的推荐者一个手续费卡
                    itemStageDao.updateUserFeeNumByUserId(String.valueOf(stageCost.get("artistPresenter")));
                    user_fee.put("user_id",stageCost.get("artistPresenter"));
                    itemStageDao.insertUserFee(user_fee);

                    //更改艺术家首次接包状态
                    itemStageDao.updateIspoReceiverByUserId(String.valueOf(stageCost.get("artistUserId")));

                }
            }

            //改变阶段状态为已完成
            itemStage.put("stage_status",134004);
            itemStageDao.updateItemStageStatusById(itemStage);

            //根据任务ID查找项目是否已经全部完成，如果全部完成，那么改变任务进度为评价
            int count = itemStageDao.findCountorderitemStatusByItemId(String.valueOf(stageCost.get("item_id")));
            //如果等于0那么就表示项目已经完成，改变项目进度
            if(count == 0){
                itemStageDao.updateCurrentProgressByTaskId2(String.valueOf(stageCost.get("item_id")));
            }

            return true;
        }

        int nextStageId = Integer.parseInt(String.valueOf(nextStageMap.get("stage_id")));

        //得到下一个阶段的信息
        Map nextStageCost = itemStageDao.findStageCostByStageId(nextStageId);

        float nextPopur = Float.parseFloat(String.valueOf(nextStageCost.get("popur")));
        float nextFee = Float.parseFloat(String.valueOf(nextStageCost.get("fee")));
        float nextStage = Float.parseFloat(String.valueOf(nextStageCost.get("stage")));
        float nextPrestoreSurplus = Float.parseFloat(String.valueOf(nextStageCost.get("prestoreSurplus")));

        //阶段所有费用
        float nextStageSumMoney = Float.parseFloat(df.format( nextPopur + nextFee + nextStage));

        //预存资金剩余大于阶段所有费用则开启该阶段并减去预存资金费用
        if(nextPrestoreSurplus >= nextStageSumMoney){

            //改变状态为进行中
            nextStageMap.put("stage_status",134003);

            itemStageDao.updateItemStageStatusById(nextStageMap);

            nextStageMap.put("stageSumMoney",nextStageSumMoney);
            nextStageMap.put("order_task_id",order_task_id);
            itemStageDao.updateOrderTaskPrestoreSurplus(nextStageMap);

        }else{
            //改变状态为预存资金
            nextStageMap.put("stage_status",134002);

            itemStageDao.updateItemStageStatusById(nextStageMap);
        }

        //改变阶段状态为已完成
        itemStage.put("stage_status",134004);
        itemStageDao.updateItemStageStatusById(itemStage);
        return true;
    }


}
